package com.ruoyi.water.controller;

import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.water.domain.IdCorrespond;
import com.ruoyi.water.domain.dto.ApiResponse;
import com.ruoyi.water.domain.dto.WaterMeterArchiveDTO;
import com.ruoyi.water.domain.dto.WaterMeterArchivePageRespDTO;
import com.ruoyi.water.service.IIdCorrespondService;
import com.ruoyi.water.service.IWaterMeterDataSyncService;
import com.ruoyi.water.service.WaterMeterArchiveService;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import static com.ruoyi.water.utils.ElementIdExtractor.extractIdWithDirection;

/**
 * 表具档案同步控制器
 */
@RestController
@RequestMapping("/api/water/meter/sync")
public class WaterMeterSyncController {

    @Autowired
    private WaterMeterArchiveService waterMeterArchiveService;

    @Autowired
    private IIdCorrespondService idCorrespondService;

    @Autowired
    private IWaterMeterDataSyncService waterMeterDataSyncService;

    /**
     * 同步水表数据（自定义时间范围）
     * @param startTime 开始时间（格式：yyyy-MM-dd HH:mm:ss）
     * @param endTime   结束时间（格式：yyyy-MM-dd HH:mm:ss）
     */
    @PostMapping("/data")
    public AjaxResult syncMeterData(
            @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) Date startTime,
            @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) Date endTime) {
        try {
            int count = waterMeterDataSyncService.syncMeterData(startTime, endTime);
            return AjaxResult.success("水表数据同步成功，共插入" + count + "条记录");
        } catch (Exception e) {
            return AjaxResult.error("水表数据同步失败：" + e.getMessage());
        }
    }

    /**
     * 同步表具ID与资产编号到数据库
     */
    @PostMapping("/archiveToDb")
    public AjaxResult syncArchiveToDb(HttpServletRequest request) {
        try {
            // 1. 构建查询参数（与原ReqDTO参数保持一致）
            // 格式：pageNumber=1&pageSize=100&type=1
//            StringBuilder queryParams = new StringBuilder();
//            queryParams.append("pageNumber=1")
//                    .append("&pageSize=1000")
//                    .append("&type=1");
            String queryParams = request.getQueryString();

            // 2. 调用服务层方法，传递构建好的查询参数字符串
            ApiResponse<WaterMeterArchivePageRespDTO> response =
                    waterMeterArchiveService.getMeterArchiveList(queryParams.toString());


            WaterMeterArchivePageRespDTO data = response.getData();
            if (data == null || data.getRecords() == null || data.getRecords().isEmpty()) {
                return AjaxResult.success("未查询到表具档案数据");
            }

            // 3. 转换数据为数据库实体
            List<IdCorrespond> correspondList = new ArrayList<>();
            for (WaterMeterArchiveDTO archive : data.getRecords()) {
                IdCorrespond correspond = new IdCorrespond();
                correspond.setId(archive.getId());
                correspond.setMeterId(extractIdWithDirection(archive.getName()));
                correspondList.add(correspond);
            }
            // 4. 批量保存到数据库
            int count = idCorrespondService.batchSave(correspondList);
            return AjaxResult.success("同步成功，共插入 " + count + " 条数据");
        } catch (Exception e) {
            return AjaxResult.error("同步失败：" + e.getMessage());
        }
    }
}
